package com.hnas.core.dao;

import java.util.List;
import java.util.Map;

import javax.persistence.LockModeType;

/**
 * 
 * @author 郑兴(zhengxing)
 *
 * @param <B>
 */
public interface BaseDao<B> {
	/**
	 * <pre>查询记录</pre>
	 * @Auther 郑兴(zhengxing)
	 * @Date 2013-7-17
	 * @param id
	 * @return
	 */
	public B find(Object id);
	/**
	 * <pre></pre> 
	 *@auther 周勇（zhou-y）
	 * 2013-11-4
	 * @param id
	 * @return
	 */
	public B get(Object id);
	
	/**
	 * <pre>按名称和参数查询</pre>
	 * @Auther 郑兴(zhengxing)
	 * @Date 2013-7-17
	 * @param queryName
	 * @param objects
	 * @return
	 */
	public List<B> findByNamedQuery(String queryName, Object... objects);
	/**
	 * <pre>根据sql语句和参数查询</pre> 
	 *@auther 周勇（zhou-y）
	 * 2013-8-14
	 * @param query
	 * @param objects
	 * @return
	 */
	public List<B> findByQuery(String query, Object... objects);
	/**
	 * <pre>获得返回的记录数</pre> 
	 *@auther 周勇（zhou-y）
	 * 2013-8-16
	 * @param query
	 * @param objects
	 * @return
	 */
	public Long count(String query, Object... objects);
	/**
	 * <pre>指定返回的记录数</pre> 
	 *@auther 周勇（zhou-y）
	 * 2013-8-16
	 * @param query
	 * @param startIndex
	 * @param rowCount
	 * @param objects
	 * @return
	 */
	public List<B> findByRange(String query, int startIndex, int rowCount, Object... objects);
	
	/**
	 * <pre>分页查询</pre> 
	 *@auther 周勇（zhou-y）
	 * 2013-8-16
	 * @param page
	 * @param objects
	 */
	void queryByPage(PageBean<B> page, Object... objects);
	/**
	 * <pre>按名称和参数查询</pre>
	 * @Auther 郑兴(zhengxing)
	 * @Date 2013-7-17
	 * @param queryName
	 * @param paramMap
	 * @return
	 */
	public List<B> findByNamedQueryAndNamedParams(String queryName, Map<String, Object> paramMap);
	/**
	 * <pre>根据sql语句和参数查询</pre> 
	 *@auther 周勇（zhou-y）
	 * 2013-8-14
	 * @param query
	 * @param paramMap
	 * @return
	 */
	public List<B> findByQueryAndNamedParams(String query, Map<String, Object> paramMap); 
	/**
	 * <pre>查询记录</pre>
	 * @Auther 郑兴(zhengxing)
	 * @Date 2013-7-17
	 * @param id
	 * @return
	 */
	public B getReference(Object id);

	/**
	 * <pre>保存记录</pre>
	 * @Auther 郑兴(zhengxing)
	 * @Date 2013-7-17
	 * @param obj
	 */
	public void persist(B obj);

	/**
	 * <pre>更新记录</pre>
	 * @Auther 郑兴(zhengxing)
	 * @Date 2013-7-17
	 * @param obj
	 */
	public void merge(B obj);
	
	/**
	 * <pre>更新记录</pre>
	 * @Auther 郑兴(zhengxing)
	 * @Date 2013-7-17
	 * @param obj
	 */
	public void refresh(B obj);

	/**
	 * <pre>删除记录</pre>
	 * @Auther 郑兴(zhengxing)
	 * @Date 2013-7-17
	 * @param obj
	 */
	public void remove(B obj);
	
	/**
	 * <pre>加锁</pre>
	 * @Auther 郑兴(zhengxing)
	 * @Date 2013-7-17
	 * @param obj
	 * @param type
	 */
	public void lock(final B obj, final LockModeType type);
}